package com.sunday.common.netty.e4_TCP.server;

import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.handler.codec.LineBasedFrameDecoder;
import io.netty.handler.codec.string.LineEncoder;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import io.netty.util.CharsetUtil;

/**
 * ChannelDuplexHandler 是一个既可以处理入站数据也可以处理出站数据的 ChannelHandler。
 * 它可以覆盖 channelRead 和 write 方法，因此可以同时处理入站和出站的数据流。
 *
 * ChannelOutboundHandler 是专门用于处理出站数据的 ChannelHandler。
 * 它主要关注于对将要发送到远程节点的数据进行处理，而不会处理接收自远程节点的数据。
 *
 * ChannelInboundHandlerAdapter 它实现了 ChannelInboundHandler 接口，提供了一些方法来处理入站事件，如 channelRead、channelActive 等。
 * 开发人员可以继承该类，并重写需要的方法来处理特定的入站事件，使得处理入站数据变得更加方便和灵活。
 *
 * 除了之前提到的 ChannelDuplexHandler 和 ChannelOutboundHandler，在 Netty 中还有一些其他常见的 Handler 类型，包括：
 * ChannelInboundHandler: 用于处理入站数据的接口。
 * ChannelOutboundHandler: 用于处理出站数据的接口。
 * ChannelInitializer: 用于在 Channel 注册时对 Channel 进行初始化设置的特殊 Handler 类型。
 * SimpleChannelInboundHandler: 继承自 ChannelInboundHandlerAdapter，专门用于处理入站消息并释放资源，通常用于处理最后消息。
 * ChannelHandlerAdapter: 一个抽象类，实现了 ChannelHandler 接口，为了简化用户定义的 ChannelHandler 实现。
 *
 * DefaultChannelPromise 是 Netty 框架中的一个默认实现，用于表示一个未来（Future）的结果。它通常与异步操作相关，比如网络请求、I/O 操作等。
 * 通过 DefaultChannelPromise，可以添加监听器以便在操作完成时执行特定的逻辑，并获取操作的结果。
 */
public class TcpServerChannel extends ChannelInitializer {

    @Override
    protected void initChannel(Channel ch) throws Exception {
        ChannelPipeline channelPipeline = ch.pipeline();
        channelPipeline
                // LineBasedFrameDecoder: 基于换行符的解码器，支持携带结束符或不携带结束符两种解码方式，同时支持配置单行的最大长度。
                .addLast(new LineBasedFrameDecoder(1024))
                // StringDecoder: 字符串解码器，将接收到的对象转换成字符串，然后继续调用后面的处理器。
                .addLast(new StringDecoder())
                .addLast(new LoggingHandler(LogLevel.INFO))
                // LineEncoder: 行编码器，将字符串对象转换成字符串后，再将其添加换行符后发送到对端。
                .addLast(new LineEncoder(CharsetUtil.UTF_8))
                .addLast(new TcpServerHandler());
    }

}
